<?php
/**
 * Controller_Article
 *
 * Класс Controller_Article отвечает за обработку статей
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Controller_Article extends Controller_Base {

	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
		Service_Debug::setDebug();
		switch ($this->arrRequest[1]) {
			case '': case 'list':
				if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
				else $pageNumber = 1; // По умолчанию выводим первую страницу
				
				$objArticle = new Article();
				// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
				$essenceCount = $objArticle->count();
				$pagesNumber = ceil($essenceCount / $objArticle->essenceNumberOnPage); // Необходимое количество страниц для навигации
				// Если GET пуст или в нём указан правильный номер страницы
				if(!$_GET || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) $this->actionList($objArticle,null,$pagesNumber,$pageNumber);
				else $this->setError(404);
			  break;
			case 'add':
				if (SimpleAdministration::isAdmin()) $this->actionAdd();
				else $this->setError(403);
				break;
			case 'edit':
				if (SimpleAdministration::isAdmin()) {
					$objArticle = new Article($this->arrRequest[2]);
					if (!$objArticle->id) $this->setError(404);
					else $this->actionEdit($objArticle);
				}
				else $this->setError(403);
				break;
			case 'archive':
				if(!$this->arrRequest[2]) $this->actionArchive();
				else if(preg_match("#^[0-9]{2}-[0-9]{4}$#", $this->arrRequest[2])) { // Если формат ММ-ГГГГ
					$objArticle = new Article();
					$articlesArray = $objArticle->getMonthArchive($this->arrRequest[2]);
					if(!empty($articlesArray)) $this->actionMonthArchive($articlesArray);
					else $this->setError(404);
				}
				break;
			default:
				$this->setError(404);
				break;
		}
	}

	/**
	 * Выводит страницу конкретной статьи
	 *
	 */
	public function actionShowOne($objArticle, $objCategory) {
		Service_Debug::setDebug();
		if (!isset($_COOKIE[$objArticle->id])) { // Если для этой статьи нет куки, то наращиваем её счётчик просмотров, и записываем куку
			$objArticle->increaseCounter();
			setcookie($objArticle->id, 1, time() + 86400, W_ABSPATH);
		}
		
		$objComments = new ArticleComment();
		$arrComments = $objComments->find('all', array('conditions' => "`article_comment`.`ID_article`='" . $objArticle->id . "'", 'order' => '`article_comment`.`created_at'));
		
		$this->showLeftColumn = true;
		$this->bodyAttrs = 'class="article"';
		$this->title = $objArticle->getField('article_name');
		$objViewArticle = new View_Article();
		 
		$this->showHeader();
		$objViewArticle->ShowOne($objArticle, $objCategory, $arrComments);
		$this->showFooter();
	}
	
	/**
	 * Выводит список существующих статей
	 * @param Article $objArticle - объект статьи
	 * @param string $categoryName - имя категории, статьи которой выводятся
	 * @param int $pageNumber - номер страницы
	 * @param int $pagesNumber - количество страниц для навигации
	 */
	public function actionList($objArticle, $objCategory, $pagesNumber, $pageNumber) {
		Service_Debug::setDebug();
	  	// Получаем либо список всех статей либо только статей конкретной категории
		if(!$objCategory) $tempArrArticles = $objArticle->find('all', array('select' => '`article`.`ID_article`,`article`.`viewings`,`article`.`created_at`,`article`.`article_name`, `article`.`text`, `article`.`url` AS `article_url`, `category`.`url` AS `category_url`, `category`.`category_name`', 'joins' => 'LEFT JOIN `category` ON `article`.`ID_category` = `category`.`ID_category`', 'order' => '`article`.`created_at` DESC', 'limit' => $pageNumber * $objArticle->essenceNumberOnPage));
		else
			if ($objCategory->id) $tempArrArticles = $objArticle->find('all', array('select' => '`article`.`ID_article`,`article`.`viewings`,`article`.`created_at`,`article`.`article_name`, `article`.`text`, `article`.`url` AS `article_url`, `category`.`url` AS `category_url`, `category`.`category_name`', 'joins' => 'LEFT JOIN `category` ON `article`.`ID_category` = `category`.`ID_category`', 'order' => '`article`.`created_at` DESC', 'limit' => $pageNumber *  $objArticle->essenceNumberOnPage, 'conditions' => "`article`.`ID_category`='" . $objCategory->id . "'"));
			else $tempArrArticles = $objArticle->find('all', array('select' => '`article`.`ID_article`,`article`.`viewings`,`article`.`created_at`,`article`.`article_name`, `article`.`text`, `article`.`url` AS `article_url`, `category`.`url` AS `category_url`, `category`.`category_name`', 'joins' => 'LEFT JOIN `category` ON `article`.`ID_category` = `category`.`ID_category`', 'order' => '`article`.`created_at` DESC', 'limit' => $pageNumber *  $objArticle->essenceNumberOnPage, 'conditions' => '`article`.`ID_category` IS NULL'));
		
		// Номер первой отображаемой статьи на странице
		$firstArticle = ($pageNumber - 1) * $objArticle->essenceNumberOnPage;
		// Номер последней отображаемой статьи на странице
		$lastArticle = $firstArticle + $objArticle->essenceNumberOnPage;  
	  	for ($k=$firstArticle;$k<$lastArticle;$k++) {
	  		if (isset($tempArrArticles[$k])) $arrArticles[] = $tempArrArticles[$k];
	  	}
	  	
	  	$this->showLeftColumn = true;
	  	if ($objCategory == null) $this->title = $this->pageHead = 'Последние статьи';
	  	elseif ($objCategory->id) $this->title = $this->pageHead = $objCategory->getField('category_name');
	  	else $this->title = $this->pageHead = 'Другие статьи';
	  	if (SimpleAdministration::isAdmin()) $this->addUrl = W_ABSPATH . 'articles/add/';

	 	$objViewArticle = new View_Article();
	  	$this->showHeader();
	    $objViewArticle->showAdminList(&$arrArticles, $objCategory, $pagesNumber, $pageNumber);
		$this->showFooter();
	}
	
	/**
	 * Страница добавления статей 
	 */
	public function actionAdd() {
	  Service_Debug::setDebug();
	  if (isset($_POST['Article'])) {
			$objArticle = new Article($_POST['Article']);
			if ($objArticle->save()) User_Session::moveTo(W_ABSPATH . 'articles/edit/' . $objArticle->getField('ID_article'), 'Статья успешно добавлена', 1);
		}
		else $objArticle = new Article();
		
	  $this->pageHead = 'Добавление статьи';
	  $objViewArticle = new View_Article();
	  $this->addWysiwygMetas();

	  $this->showHeader();
	    $objViewArticle->showEditForm($objArticle);
		$this->showFooter();
	}
	
  /**
   * Выводит страницу редактирования статьи
   * 
   * @param Article $objArticle - объект статьи для редактирования
   */
  public function actionEdit(Article $objArticle) {
  	Service_Debug::setDebug();
	$editId = $objArticle->id;
  	if (isset($_POST['Article'])) {
			$objArticle = new Article($_POST['Article']);
			if ($objArticle->id != $editId) User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH) . 'articles/', Service_Translate::getText('Недопустимое действие'));
			if ($objArticle->save()) User_Session::moveTo(W_ABSPATH . 'articles/', 'Статья успешно сохранена', 1);
		}
  	$objViewArticle = new View_Article();
  	$this->pageHead = $this->title = 'Редактирование статьи "' . $objArticle->getField('article_name') . '"';
  	$this->addWysiwygMetas();
    
  	$this->showHeader();
      $objViewArticle->showEditForm($objArticle);
    $this->showFooter();
  }
  
  /**
   * Выводит главную страницу архива статей
   */
  public function actionArchive() {
  	Service_Debug::setDebug();
 	$objArticle = new Article();
 	$monthsArray = $objArticle->getArchiveList(); 
 	$this->title = $this->pageHead = 'Архив статей';
	
 	$objViewArticle = new View_Article();
  	$this->showHeader();
  	$objViewArticle->showArchive($monthsArray);
  	$this->showFooter();
  }
  
  /**
   * Выводит страницу архива со статьями за конкретный месяц-год
   */
  public function actionMonthArchive($articlesArray) {
  	Service_Debug::setDebug();
  	$this->title = $this->pageHead = 'Архив статей за ' . Service_Date::changeDateFormat($articlesArray[0]['created_at'], 'Y-m-d H-i-s', 'Z Y');
  	
  	$objViewArticle = new View_Article();
  	$this->showHeader();
  	$objViewArticle->showAdminList($articlesArray);
  	$this->showFooter();
  }
  
}
?>